package com.jason.util;


import tk.mybatis.mapper.util.StringUtil;

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DateUtil implements java.io.Serializable {

    /**
     *
     */
    private static final long serialVersionUID = -3758536094497678451L;

    /**
     * 时间格式化、格式
     */
    public static final String DateTimeFormatter = "yyyy-MM-dd HH:mm:ss";


    /**
     * 时间格式化、格式
     */
    public static final String DateTime = "yyyy-MM-dd";

    /**
     * 时间
     */
    public static final String TIME = "HH:mm:ss";

    public static final String PATTERN_MM = "yyyy-MM";

    public static final String PATTERN_YY = "yyyy";


    /**
     * 一分钟有多少秒
     */
    public static final int ONE_MINUTE_SECONDS = (int) TimeUnit.MINUTES.toSeconds(1L);


    /**
     * 获取当前系统的时间戳
     *
     * @return 毫秒
     */
    public static Long getCurrentTimeMillis() {
        return new Date().getTime();
    }

    /**
     * 获取当前系统的时间戳
     *
     * @return 毫秒
     */
    public static Date getCurrentTimestamp() {
        return new Timestamp(System.currentTimeMillis());
    }


    /**
     * 获取当前系统的时间戳
     *
     * @return 秒
     */
    public static Integer getCurrentTime() {
        return Long.valueOf(new Date().getTime() / 1000).intValue();
    }

    /**
     * 获取当前时间的0点时间
     *
     * @return
     */
    public static Integer getCurrentZeroTime() {
        SimpleDateFormat format = new SimpleDateFormat(DateTime);
        String date = format.format(new Date()).toString();
        date += " 00:00:00";
        return getDateTimeStamp(date);
    }

    /**
     * 获取指定时间的时间 去除日期
     *
     * @return
     */
    public static String getTime(Date date) {
        SimpleDateFormat format = new SimpleDateFormat(TIME);
        return format.format(date).toString();
    }

    /**
     * 获取指定时间的日期 去除时间
     *
     * @return
     */
    public static String getDay(Date date) {
        SimpleDateFormat format = new SimpleDateFormat(DateTime);
        return format.format(date).toString();
    }


    /**
     * 获取当前系统的时间戳
     *
     * @return 秒
     */
    public static Long getTimeMillis(Date date) {
        return date.getTime() / 1000;
    }

    /**
     * 转化为时间戳，单位：秒
     * 使用默认的时间格式
     *
     * @param dateTime
     * @return
     */
    public static Integer getDateTimeStamp(String dateTime) {

        return DateUtil.getDateTimeStamp(dateTime, DateTimeFormatter);
    }

    /**
     * 获得系统当前时间  yyyy-MM-dd HH:mm:ss
     *
     * @return
     */
    public static String getCurrentTimeStamp() {
        SimpleDateFormat format = new SimpleDateFormat(DateTimeFormatter);
        return format.format(new Date());
    }

    /**
     * 获取指定日期 对应的另一种日志格式 ex: 2016-07-12 -> 2016-07-12 00:00:00
     *
     * @param dateStr
     * @return
     */
    public static String getSpecDateTimeStamp(String dateStr) {
        Date date = parse2Date(dateStr, DateTime);
        SimpleDateFormat format = new SimpleDateFormat(DateTimeFormatter);
        return format.format(date);
    }

    /**
     * 转化为时间戳，单位：秒
     * 使用自定义的时间格式
     *
     * @param dateTime
     * @return
     */
    public static Integer getDateTimeStamp(String dateTime, String formatter) {

        try {
            if (dateTime == null || dateTime.equals("")) {
                return 0;
            }
            SimpleDateFormat format = new SimpleDateFormat(formatter);
            Long value = format.parse(dateTime).getTime() / 1000;
            return value.intValue();
        } catch (ParseException e) {
            e.printStackTrace();
            return 0;
        }
    }


    /**
     * 转化为时间戳，单位：秒
     * 使用自定义的时间格式
     *
     * @param
     * @return
     */
    public static Long getBeforeTimeStamp() {
        Calendar cal1 = Calendar.getInstance();
        cal1.add(Calendar.DATE, -3);
        return cal1.getTime().getTime() / 1000;
    }


    /**
     * 是否在当前时间之前
     * 是： true
     *
     * @param timeStamp
     */

    public static boolean isBeforeNow(long timeStamp) {

        long current = DateUtil.getCurrentTime();
        if (current >= timeStamp) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 是否在当前时间之后
     * 是： true
     *
     * @param timeStamp
     */
    public static boolean isAfterNow(long timeStamp) {

        long current = DateUtil.getCurrentTime();
        if (current <= timeStamp) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 获取7天后的
     *
     * @return
     */
    public String getNextWeekDay() {
        Calendar curr = Calendar.getInstance();
        curr.set(Calendar.DAY_OF_MONTH, curr.get(Calendar.DAY_OF_MONTH) + 7);
        Date date = curr.getTime();
        return new SimpleDateFormat(DateTime).format(date);
    }


    /**
     * 获取昨天的时间
     *
     * @return
     */
    public static Date getBeforeDate() {
        return DateUtil.getBeforeDate(1);
    }


    /**
     * 获取昨天的日期,如2018-07-13
     *
     * @return
     */
    public static Date getYesterdayDate() {
        try {
            Date yesterday = DateUtil.getBeforeDate();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            String s = sdf.format(yesterday);
            Date date = sdf.parse(s);
            return date;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取今天的日期,如2018-08-08
     *
     * @return
     */
    public static Date getTodayDate() {
        try {
            Date today = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            String s = sdf.format(today);
            Date date = sdf.parse(s);
            return date;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取之前的时间
     *
     * @return
     */
    public static Date getBeforeDate(int duration) {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, (0 - duration));
        return cal.getTime();
    }

    /**
     * 将时间戳格式化
     *
     * @param dateTime
     * @return
     */
    public static String displayTimeStamp(long dateTime, String formatter) {
        if (dateTime == 0) {
            return "";
        }
        SimpleDateFormat format = new SimpleDateFormat(formatter);
        return format.format(new Date(dateTime * 1000L));
    }

    /**
     * 将时间戳格式化
     *
     * @param dateTime
     * @return
     */
    public static String displayTimeStamp(long dateTime) {
        if (dateTime == 0) {
            return "";
        }
        return DateUtil.displayTimeStamp(dateTime, DateTimeFormatter);
    }

    public static Date getCurrentDate() {
        return new Date();
    }

    /**
     * 按照格式获取时间
     *
     * @param formart
     * @return
     */
    public static String getDate(String formart) {
        return new SimpleDateFormat(formart).format(new Date());
    }

    /**
     * 按照格式获取时间
     *
     * @param formart
     * @return
     */
    public static String getDate(Date date, String formart) {
        return new SimpleDateFormat(formart).format(date);
    }

    /**
     * 将字符串转换成日期
     *
     * @param text
     * @return
     */
    public static Date parse2Date(String text) {
        return DateUtil.parse2Date(text, DateTimeFormatter);
    }

    /**
     * 将字符串转换成日期
     *
     * @param text
     * @return
     */
    public static Date parse2Date(String text, String formatter) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(formatter);
            return sdf.parse(text);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }
    }

    /**
     * @param format    秒精度的时间戳，比System.currentTimeMillis()精度低3位
     * @param timestamp
     * @return
     */
    public static String format(String format, long timestamp) {
        DateFormat dateFormat = new SimpleDateFormat(format);
        String s = dateFormat.format(new Date(timestamp * 1000));
        return s;
    }

    public static String format(String format, Date date) {
        DateFormat dateFormat = new SimpleDateFormat(format);
        String s = dateFormat.format(date);
        return s;
    }

    public static String format(Date date, String format) {
        if (date == null) {
            return null;
        }

        return new SimpleDateFormat(format).format(date);
    }

    public static String getDateString(Date date, DateFormat dateFormat) {
        if (date == null || dateFormat == null) {
            return null;
        }

        return dateFormat.format(date);
    }

    public static Date getDateAfterMinutes(Date date, Integer minute) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MINUTE, minute);
        return calendar.getTime();
    }



}